home *** CD-ROM | disk | FTP | other *** search
/ Aminet 1 (Walnut Creek) / Aminet - June 1993 [Walnut Creek].iso / usenet / sources / volume91 / utilitys / beav_132 / part03 / ttykbd.c < prev   
C/C++ Source or Header  |  1991-11-13  |  11KB  |  352 lines

  1. /*
  2.  *      Wang PC keyboard handler
  3.  */
  4. #include    "def.h"
  5.  
  6. extern    char    MSG_sp_key[];
  7. extern    char    MSG_byte_shift[];
  8. extern    char    MSG_back_char[];
  9. extern    char    MSG_quit[];
  10. extern    char    MSG_forw_del_char[];
  11. extern    char    MSG_toggle_swap[];
  12. extern    char    MSG_forw_char[];
  13. extern    char    MSG_abort[];
  14. extern    char    MSG_ins_self[];
  15. extern    char    MSG_back_del_char[];
  16. extern    char    MSG_refresh[];
  17. extern    char    MSG_forw_line[];
  18. extern    char    MSG_back_line[];
  19. extern    char    MSG_quote[];
  20. extern    char    MSG_recall[];
  21. extern    char    MSG_twiddle[];
  22. extern    char    MSG_forw_page[];
  23. extern    char    MSG_kill_region[];
  24. extern    char    MSG_yank[];
  25. extern    char    MSG_down_window[];
  26. extern    char    MSG_ins_toggle[];
  27. extern    char    MSG_display_buffers[];
  28. extern    char    MSG_quit[];
  29. extern    char    MSG_exit_flush_all[];
  30. extern    char    MSG_set_file_name[];
  31. extern    char    MSG_file_insert[];
  32. extern    char    MSG_buf_size_lock[];
  33. extern    char    MSG_flush_all[];
  34. extern    char    MSG_down_window[];
  35. extern    char    MSG_up_window[];
  36. extern    char    MSG_file_read[];
  37. extern    char    MSG_file_save[];
  38. extern    char    MSG_file_visit[];
  39. extern    char    MSG_file_write[];
  40. extern    char    MSG_swap_dot_and_mark[];
  41. extern    char    MSG_shrink_window[];
  42. extern    char    MSG_display_position[];
  43. extern    char    MSG_start_macro[];
  44. extern    char    MSG_end_macro[];
  45. extern    char    MSG_help[];
  46. extern    char    MSG_only_window[];
  47. extern    char    MSG_split_window[];
  48. extern    char    MSG_use_buffer[];
  49. extern    char    MSG_spawn_cli[];
  50. extern    char    MSG_execute_macro[];
  51. extern    char    MSG_goto_line[];
  52. extern    char    MSG_ins_unit[];
  53. extern    char    MSG_kill_buffer[];
  54. extern    char    MSG_load_bindings[];
  55. extern    char    MSG_forw_window[];
  56. extern    char    MSG_back_window[];
  57. extern    char    MSG_view_file[];
  58. extern    char    MSG_enlarge_window[];
  59. extern    char    MSG_ascii_mode[];
  60. extern    char    MSG_binary_mode[];
  61. extern    char    MSG_buffer_name[];
  62. extern    char    MSG_decimal_mode[];
  63. extern    char    MSG_ebcdic_mode[];
  64. extern    char    MSG_hex_mode[];
  65. extern    char    MSG_back_del_unit[];
  66. extern    char    MSG_octal_mode[];
  67. extern    char    MSG_display_version[];
  68. extern    char    MSG_unit_size1[];
  69. extern    char    MSG_unit_size2[];
  70. extern    char    MSG_unit_size4[];
  71. extern    char    MSG_reposition_window[];
  72. extern    char    MSG_set_mark[];
  73. extern    char    MSG_goto_eob[];
  74. extern    char    MSG_goto_bob[];
  75. extern    char    MSG_next_buff[];
  76. extern    char    MSG_prev_buff[];
  77. extern    char    MSG_query_replace[];
  78. extern    char    MSG_display_bindings[];
  79. extern    char    MSG_auto_save[];
  80. extern    char    MSG_back_unit[];
  81. extern    char    MSG_compare[];
  82. extern    char    MSG_forw_del_unit[];
  83. extern    char    MSG_forw_unit[];
  84. extern    char    MSG_link_windows[];
  85. extern    char    MSG_print[];
  86. extern    char    MSG_back_search[];
  87. extern    char    MSG_forw_search[];
  88. extern    char    MSG_back_page[];
  89. extern    char    MSG_copy_region[];
  90. extern    char    MSG_extended_command[];
  91. extern    char    MSG_up_window[];
  92. extern    char    MSG_search_again[];
  93. extern    char    MSG_bind_to_key[];
  94. extern    char    MSG_file_visit_split[];
  95. extern    char    MSG_yank_buffer[];
  96. extern    char    MSG_save_region[];
  97. extern    char    MSG_use_buffer_split[];
  98. extern    char    MSG_no_f_tb[];
  99.  
  100. #define SPECIAL 0x1F            /* Special keys         */
  101.  
  102. typedef    struct  key_name_array 
  103. {
  104.     int     key_code;
  105.     char    *func_name_str;
  106.     char    *key_name_str;
  107. }   KEY_NAME_ARRAY;
  108. #if MSDOS
  109. extern  bool    wang_pc;
  110. extern  bool    ibm_pc;
  111. #endif
  112. /*
  113.  * The keyboard's special characters, those things that are prefixed with
  114.  * a 0x1F, are placed into the keyboard tables as KCTRL || 0x80 || x, for some
  115.  * x, i.e. they have both the control and 0x80 bits set, so they won't conflict
  116.  * with anything else on the keyboard.
  117.  */
  118.  
  119.  
  120. /*
  121.  * Names for the keys with basic keycode
  122.  * between KFIRST and KLAST (inclusive). This is used by
  123.  * the key name routine in "kbd.c".
  124.  */
  125. #if MSDOS
  126. KEY_NAME_ARRAY wang_keys[] =
  127. {
  128.     KCTRL | 0x80, MSG_bind_to_key, "Indent", 
  129.         /*  KCTRL | 0x81, NULL, "Page", */
  130.     KCTRL | 0x82, MSG_reposition_window, "Center",
  131.         /*  KCTRL | 0x83, NULL, "DecTab", */
  132.     /*  KCTRL | 0x84, NULL, "Format", */
  133.     /*  KCTRL | 0x85, NULL, "Merge", */
  134.     /*  KCTRL | 0x86, NULL, "Note", */
  135.     KCTRL | 0x87, MSG_set_mark, "Stop",
  136.         KCTRL | 0x88, MSG_forw_search, "Search", 
  137.         KCTRL | 0x89, MSG_yank, "Replace",
  138.         KCTRL | 0x8A, MSG_copy_region, "Copy",
  139.         KCTRL | 0x8B, MSG_kill_region, "Move",
  140.         KCTRL | 0x8C, MSG_extended_command, "Command",
  141.         KCTRL | 0x8D, MSG_forw_window, "UpDown",
  142.         /*  KCTRL | 0x8E, NULL, "BlankKey", */
  143.     KCTRL | 0x8F, MSG_goto_line, "GoTo",
  144.         /*  KCTRL | 0x90, NULL, "Sh-Indent", */
  145.     /*  KCTRL | 0x91, NULL, "Sh-Page", */
  146.     /*  KCTRL | 0x92, NULL, "Sh-Center", */
  147.     /*  KCTRL | 0x93, NULL, "Sh-DecTab", */
  148.     /*  KCTRL | 0x94, NULL, "Sh-Format", */
  149.     /*  KCTRL | 0x95, NULL, "Sh-Merge", */
  150.     /*  KCTRL | 0x96, NULL, "Sh-Note", */
  151.     /*  KCTRL | 0x97, NULL, "Sh-Stop", */
  152.     KCTRL | 0x98, MSG_search_again, "Sh-Search",
  153.         KCTRL | 0x99, MSG_query_replace, "Sh-Replace",
  154.         /*  KCTRL | 0x9A, NULL, "Sh-Copy", */
  155.     /*  KCTRL | 0x9B, NULL, "Sh-Move", */
  156.     /*  KCTRL | 0x9C, NULL, "Sh-Command", */
  157.     KCTRL | 0x9D, MSG_split_window, "Sh-UpDown",
  158.         /*  KCTRL | 0x9E, NULL, "Sh-BlankKey", */
  159.     /*  KCTRL | 0x9F, NULL, "Sh-GoTo", */
  160.     KCTRL | 0xC0, MSG_back_line, "North",
  161.         KCTRL | 0xC1, MSG_forw_char, "East",
  162.         KCTRL | 0xC2, MSG_forw_line, "South",
  163.         KCTRL | 0xC3, MSG_back_char, "West",
  164.         KCTRL | 0xC4, MSG_byte_shift, "Home",
  165.         /*  KCTRL | 0xC5, NULL, "Execute", */
  166.     KCTRL | 0xC6, MSG_ins_toggle, "Insert",
  167.         KCTRL | 0xC7, MSG_forw_del_char, "Delete",
  168.         KCTRL | 0xC8, MSG_back_page, "PrevPage",
  169.         KCTRL | 0xC9, MSG_forw_page, "NextPage",
  170.         /*  KCTRL | 0xCB, NULL, "Erase", */
  171.     /*  KCTRL | 0xCD, NULL, "BackTab", */
  172.     /*  KCTRL | 0xD0, NULL, "Sh-North", */
  173.     KCTRL | 0xD1, MSG_forw_unit, "Sh-East",
  174.         /*  KCTRL | 0xD2, NULL, "Sh-South", */
  175.     KCTRL | 0xD3, MSG_back_unit, "Sh-West",
  176.         /*  KCTRL | 0xD4, NULL, "Sh-Home", */
  177.     KCTRL | 0xD5, MSG_execute_macro, "Sh-Execute",
  178.         /*  KCTRL | 0xD6, NULL, "Sh-Insert", */
  179.     KCTRL | 0xD7, MSG_forw_del_unit, "Sh-Delete",
  180.         KCTRL | 0xD8, MSG_goto_bob, "Sh-PrevPage",
  181.         KCTRL | 0xD9, MSG_goto_eob, "Sh-NextPage",
  182.         /*  KCTRL | 0xDB, NULL, "Sh-Erase", */
  183.     /*  KCTRL | 0xDC, NULL, "Sh-Tab", */
  184.     /*  KCTRL | 0xDD, NULL, "Sh-BackTab", */
  185.     KCTRL | 0xE0, MSG_abort, "Cancel",
  186.         KMETA | KCTRL | 0xE0, MSG_abort, "Cancel",
  187.         KCTLX | KCTRL | 0xE0, MSG_abort, "Ctl-X Cancel",
  188.         KCTRL | 0xE1, MSG_display_bindings, "Help",
  189.         /*  KCTRL | 0xE2, NULL, "Glossary", */
  190.     KCTRL | 0xE3, MSG_print, "Print",
  191.         KCTRL | 0xF1, MSG_help, "Sh-Help",
  192.         /*  KCTRL | 0xF2, NULL, "Sh-Glossary", */
  193.     /*  KCTRL | 0xF3, NULL, "Sh-Print", */
  194.     0, NULL, NULL
  195. };
  196.  
  197. KEY_NAME_ARRAY  ibm_keys[] =
  198. {
  199.     KCTLX | 0x80 | 0x3B, MSG_display_bindings, "F1",
  200.         KCTLX | 0x80 | 0x3C, MSG_set_mark, "F2",
  201.         KCTLX | 0x80 | 0x3D, MSG_forw_search, "F3",
  202.         KCTLX | 0x80 | 0x3E, MSG_search_again, "F4",
  203.         KCTLX | 0x80 | 0x3F, MSG_query_replace, "F5",
  204.         KCTLX | 0x80 | 0x40, MSG_yank, "F6",
  205.         KCTLX | 0x80 | 0x41, MSG_copy_region, "F7",
  206.         KCTLX | 0x80 | 0x42, MSG_kill_region, "F8",
  207.         KCTLX | 0x80 | 0x43, MSG_goto_line, "F9",
  208.         KCTLX | 0x80 | 0x44, MSG_abort, "F10",
  209.         KCTLX | 0x80 | 0x54, MSG_help, "Sh-F1",
  210.         KCTLX | 0x80 | 0x55, MSG_file_read, "Sh-F2",
  211.         KCTLX | 0x80 | 0x56, MSG_file_save, "Sh-F3",
  212.         KCTLX | 0x80 | 0x57, MSG_file_visit, "Sh-F4",
  213.         KCTLX | 0x80 | 0x58, MSG_file_write, "Sh-F5",
  214.         KCTLX | 0x80 | 0x59, MSG_flush_all, "Sh-F6",
  215.         KCTLX | 0x80 | 0x5A, MSG_set_file_name, "Sh-F7",
  216.         KCTLX | 0x80 | 0x5B, MSG_file_insert, "Sh-F8",
  217.         KCTLX | 0x80 | 0x5C, MSG_exit_flush_all, "Sh-F9",
  218.         KCTLX | 0x80 | 0x5D, MSG_quit, "Sh-F10",
  219.         KCTLX | 0x80 | 0x5E, MSG_display_buffers, "Ctl-F1",
  220.         KCTLX | 0x80 | 0x5F, MSG_use_buffer, "Ctl-F2",
  221.         KCTLX | 0x80 | 0x60, MSG_kill_buffer, "Ctl-F3",
  222.         KCTLX | 0x80 | 0x61, MSG_next_buff, "Ctl-F4",
  223.         KCTLX | 0x80 | 0x62, MSG_prev_buff, "Ctl-F5",
  224.         KCTLX | 0x80 | 0x63, MSG_yank_buffer, "Ctl-F6",
  225.         KCTLX | 0x80 | 0x64, MSG_set_file_name, "Ctl-F7",
  226.         KCTLX | 0x80 | 0x65, MSG_file_insert, "Ctl-F8",
  227.         KCTLX | 0x80 | 0x66, MSG_exit_flush_all, "Ctl-F9",
  228.         KCTLX | 0x80 | 0x67, MSG_quit, "Ctl-F10",
  229.         KCTLX | 0x80 | 0x48, MSG_back_line, "North",
  230.         KCTLX | 0x80 | 0x4D, MSG_forw_char, "East",
  231.         KCTLX | 0x80 | 0x74, MSG_forw_unit, "Ctl-East",
  232.         KCTLX | 0x80 | 0x50, MSG_forw_line, "South",
  233.         KCTLX | 0x80 | 0x4B, MSG_back_char, "West",
  234.         KCTLX | 0x80 | 0x73, MSG_back_unit, "Ctl-West",
  235.         KCTLX | 0x80 | 0x49, MSG_back_page, "PageDown",
  236.         KCTLX | 0x80 | 0x47, MSG_goto_bob, "Home",
  237.         KCTLX | 0x80 | 0x51, MSG_forw_page, "PageUp",
  238.         KCTLX | 0x80 | 0x4F, MSG_goto_eob, "End",
  239.         KCTLX | 0x80 | 0x52, MSG_ins_toggle, "Insert",
  240.         KCTLX | 0x80 | 0x53, MSG_forw_del_char, "Delete",
  241.         KCTLX | 0x80 | 0x76, MSG_forw_window, "Ctl-PageDown",
  242.         KCTLX | 0x80 | 0x84, MSG_back_window, "Ctl-PageUp",
  243.         KCTLX | 0x80 | 0x72, MSG_print, "Ctl-Print",
  244.         KCTLX | 0x80 | 0x0F, MSG_forw_unit, "Sh-Tab",
  245.         0, NULL, NULL
  246. };
  247. #endif
  248. /*
  249.  * Read in a key, doing the low level mapping
  250.  * of ASCII code to 11 bit code.  This level deals with
  251.  * mapping the special keys into their spots in the C1
  252.  * control area.  The C0 controls go right through, and
  253.  * get remapped by "getkey".
  254.  */
  255. static int  unkey = KRANDOM;    /* jam - for ungetkey */
  256. void ungetkey (k)
  257. {
  258.     unkey = k;
  259. }
  260.  
  261. int     getkbd ()
  262. {
  263.     register int    c;
  264.  
  265.     if (unkey == KRANDOM)       /* jam */
  266.         c = ttgetc ();
  267.     else
  268.     {
  269.         c = unkey;
  270.         unkey = KRANDOM;
  271.     }
  272.     if (c == SPECIAL)
  273.     {
  274.         c = ttgetc ();
  275.         if ((c == 0xCD) || (c == 0xDD))/* Backtab is meta */
  276.             return (METACH);
  277.         return (c | KCTRL);
  278.     }
  279.     if (c == 0)
  280.     {
  281.         c = ttgetc ();
  282.         return (c | 0x80 | KCTLX);
  283.     }
  284.     return (c);
  285. }
  286.  
  287.  
  288. /*
  289.  * Terminal specific keymap initialization.
  290.  * Attach the special keys to the appropriate built
  291.  * in functions.
  292.  * As is the case of all the keymap routines, errors
  293.  * are very fatal.
  294.  */
  295. void ttykeymapinit ()
  296. {
  297. #if MSDOS
  298.     KEY_NAME_ARRAY  *ptr;
  299.     int     i;
  300.     char    buf[NCOL];
  301.     if (wang_pc)
  302.         ptr = wang_keys;
  303.  
  304.     if (ibm_pc)
  305.         ptr = ibm_keys;
  306.  
  307.     if (!wang_pc && !ibm_pc)
  308.         return;
  309.  
  310.     i = 0;
  311.     while (ptr -> key_code != 0)
  312.     {
  313.         if (ptr -> func_name_str != NULL)
  314.             keydup (ptr -> key_code, ptr -> func_name_str);
  315.         ptr++;
  316.         i++;
  317.     }
  318.     sprintf (buf, MSG_sp_key, i);
  319.     writ_echo (buf);
  320. #endif
  321. }
  322. /* 
  323. *   Search key name array for given key code.
  324. *   return pointer to key name.
  325. */
  326. char    *keystrings (key)
  327. int     key;
  328. {
  329. #if MSDOS
  330.     KEY_NAME_ARRAY  *ptr;
  331.  
  332.     if (wang_pc)
  333.         ptr = wang_keys;
  334.  
  335.     if (ibm_pc)
  336.         ptr = ibm_keys;
  337.  
  338.     if (!wang_pc && !ibm_pc)
  339.         return(NULL);
  340.  
  341.     while (ptr -> key_code != 0)
  342.     {
  343.         if (key == ptr -> key_code)
  344.         {
  345.             return (ptr -> key_name_str);
  346.         }
  347.         ptr++;
  348.     }
  349. #endif
  350.     return (NULL);
  351. }
  352.